//
//  UITableView+Huwo.m
//  HuwoCommon
//
//  Created by x x on 2018/9/13.
//  Copyright © 2018年 xx. All rights reserved.
//

#import "UITableView+App.h"
#import <objc/runtime.h>
#import "UITableViewCell+App.h"

@implementation UITableView (App)

- (HuwoTableDataSource *)huwoTableDataSource
{
    return objc_getAssociatedObject(self, _cmd);
}

- (void)setHuwoTableDataSource:(HuwoTableDataSource *)huwoTableDataSource
{
    if (huwoTableDataSource)
    {
        [huwoTableDataSource handleTableViewDataSourceAndDelegate:self];
    }
    
    objc_setAssociatedObject(self, @selector(huwoTableDataSource), huwoTableDataSource, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

@end

@interface HuwoTableDataSource ()

@property (nonatomic, weak) UITableView *tableView;
@property (nonatomic, strong) NSArray *identifiersArray;

@end

@implementation HuwoTableDataSource

- (instancetype)initWithTableView:(UITableView *)tableView
                  cellIdentifiers:(NSArray *)cellIdentifiers
{
    self = [super init];
    if (self)
    {
        self.tableView = tableView;
        self.identifiersArray = [NSArray arrayWithArray:cellIdentifiers];
        for (NSString *identifierString in cellIdentifiers)
        {
            [UITableViewCell registerTable:tableView nibIdentifier:identifierString];
        }
    }
    return self;
}

- (void)handleTableViewDataSourceAndDelegate:(UITableView *)tableView
{
    tableView.dataSource = self;
    tableView.delegate   = self;
    self.tableView = tableView;
}

- (void)setDataArray:(NSMutableArray *)dataArray
{
    _dataArray = dataArray;
    
    [self.tableView reloadData];
}

#pragma mark - UITableViewDataSource
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [self.dataArray count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    id item = [self.dataArray objectAtIndex:indexPath.row];
    
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:self.identifiersArray[0] forIndexPath:indexPath];
    if (!cell)
    {
        Class tClass = NSClassFromString(self.identifiersArray[0]);
        
        cell = [[tClass alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:self.identifiersArray[0]];
    }
    
    [cell configure:cell customObj:item indexPath:indexPath tableView:tableView];
    
    return cell;
}

#pragma mark - UITableViewDelegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    
    id item = [self.dataArray objectAtIndex:indexPath.row];
    
    if (self.cellSelectBlock)
    {
        self.cellSelectBlock(indexPath, item);
    }
}

@end
